package com.shurdroides.proyectofinal.map;

import java.util.ArrayList;

import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.OverlayItem;
import com.shurdroides.proyectofinal.R;
import com.shurdroides.proyectofinal.activities.MapaActivity;
import com.shurdroides.proyectofinal.constants.Constants;
import com.shurdroides.proyectofinal.constants.Constants.JSON;
import com.shurdroides.proyectofinal.model.ElementoPosicionable;
import com.shurdroides.proyectofinal.model.GridViewObject;
import com.shurdroides.proyectofinal.model.PuntoMapa;
import com.shurdroides.proyectofinal.model.UsuarioPosicionable;
import com.shurdroides.proyectofinal.server.Helper;
import com.shurdroides.proyectofinal.server.HttpUtils;
import com.shurdroides.proyectofinal.server.JsonDispatcher;
import com.shurdroides.proyectofinal.utils.Utils;

public class MapHelper implements Constants {

	private static JsonDispatcher dispatcher;

	public static void anadirElementoToCapa(MyItems capa, PuntoMapa p) {
		capa.addItem(new OverlayItem(p.getLocation(), p.getTipo(), p
				.getNombre()));
	}

	public static void anadirElementoToCapa(MyItems capa, GeoPoint point) {
		capa.addItem(new OverlayItem(point, null, null));
	}

	public static void populateMapFromArrayElementos(MyItems capa,
			ArrayList<ElementoPosicionable> array) {
		for (int x = 0; x < array.size(); x++)
			anadirElementoToCapa(capa, array.get(x));
	}

	public static void populateMapFromArrayUsuarios(MyItems capa,
			ArrayList<UsuarioPosicionable> array) {
		for (int x = 0; x < array.size(); x++)
			anadirElementoToCapa(capa, array.get(x));
	}

	/*
	 * 
	 */
	public static ArrayList<ElementoPosicionable> getGeoPointArrayFromJsonObjetos(
			String jString) {
		ArrayList<ElementoPosicionable> lista = new ArrayList<ElementoPosicionable>();
		JSONObject j = null;
		JSONArray mapa = null;
		try {
			j = new JSONObject(jString);
			mapa = j.getJSONArray(JSON.MAPA_OBJETOS);
		} catch (JSONException e) {
			e.printStackTrace();
		}

		for (int x = 0; x < mapa.length(); x++) {
			try {
				lista.add(new ElementoPosicionable((int) (mapa.getJSONObject(x)
						.getDouble(JSON.LAT) * 1e6), (int) (mapa.getJSONObject(
						x).getDouble(JSON.LON) * 1e6), mapa.getJSONObject(x)
						.getLong(JSON.ID), mapa.getJSONObject(x).getInt(
						JSON.TIPO), mapa.getJSONObject(x)
						.getString(JSON.NOMBRE)));
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	/*
	 * 
	 */
	public static ArrayList<UsuarioPosicionable> getGeoPointArrayFromJsonUsuarios(
			String jString) {
		ArrayList<UsuarioPosicionable> lista = new ArrayList<UsuarioPosicionable>();
		JSONObject j = null;
		JSONArray mapa = null;
		try {
			j = new JSONObject(jString);
			mapa = j.getJSONArray(JSON.MAPA_USUARIOS);
		} catch (JSONException e) {
			e.printStackTrace();
		}

		for (int x = 0; x < mapa.length(); x++) {
			try {
				lista.add(new UsuarioPosicionable((int) (mapa.getJSONObject(x)
						.getDouble(JSON.LAT) * 1e6), (int) (mapa.getJSONObject(
						x).getDouble(JSON.LON) * 1e6), mapa.getJSONObject(x)
						.getString(JSON.CORREO), mapa.getJSONObject(x)
						.getString(JSON.NOMBRE)));
			} catch (JSONException e) {
			}
		}
		return lista;
	}

	public static boolean dentroDelRadio(GeoPoint a, GeoPoint b, double radio) {
		Location locA = new Location("punto A");
		Location locB = new Location("punto B");

		locA.setLatitude(a.getLatitudeE6());
		locA.setLongitude(a.getLongitudeE6());
		locB.setLatitude(b.getLatitudeE6());
		locB.setLongitude(b.getLongitudeE6());

		return radio >= locA.distanceTo(locB) / 1e6;
	}

	public static PuntoMapa getPuntoMapaFromGeoPoint(GeoPoint g) {
		return new PuntoMapa(g, "actual");
	}

	public static GeoPoint getMyActualPosition(Context ctx) {
		LocationManager location = (LocationManager) ctx
				.getSystemService(Context.LOCATION_SERVICE);
		Location loc = location
				.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
		return new GeoPoint(((int) (loc.getLatitude() * 1e6)),
				(int) (loc.getLongitude() * 1e6));
	}

	public static ArrayList<Double> getMyActualPositionLatLon(Context ctx) {
		ArrayList<Double> posiciones = new ArrayList<Double>();
		LocationManager location = (LocationManager) ctx
				.getSystemService(Context.LOCATION_SERVICE);
		Location loc = location
				.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
		posiciones.add(loc.getLatitude());
		posiciones.add(loc.getLongitude());
		return posiciones;
	}

	public static void vaciaCapa(MyItems capa) {
		if (!capa.isEmpty())
			for (int x = 0; x < capa.size(); x++)
				capa.removeItem(x);
	}

	public static void creaDialogoUsuario(final Context ctx,
			final UsuarioPosicionable usu) {
		final Dialog dialog = new Dialog(ctx);
		dialog.setContentView(R.layout.user_dialog);
		dialog.setTitle(usu.getNombre());
		dialog.setCancelable(true);

		ImageView img = (ImageView) dialog.findViewById(R.id.imagen);
		img.setImageResource(R.drawable.logo);

		final EditText txt = (EditText) dialog
				.findViewById(R.id.edit_text_mensaje);
		Button btnCancel = (Button) dialog.findViewById(R.id.btn_cancel);
		Button btnRobar = (Button) dialog.findViewById(R.id.btn_robar);
		Button btnMensaje = (Button) dialog.findViewById(R.id.btn_msensaje);

		btnCancel.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				dialog.cancel();
			}
		});

		btnRobar.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Toast.makeText(ctx, "Implementando...", Toast.LENGTH_SHORT)
						.show();
			}
		});

		btnMensaje.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				HttpUtils.sendMessage(ctx, usu.getCorreo(), txt.getText()
						.toString());
				dialog.cancel();
				Toast.makeText(ctx, "Mensaje enviado", Toast.LENGTH_SHORT)
						.show();
			}
		});

		dialog.show();
	}

	public static void creaDialogoElemento(final Context ctx,
			final ElementoPosicionable elem) {

		String nombre = elem.getNombre();
		final GridViewObject g = Helper.getDataHelper(ctx)
				.selectObjectoByName(nombre);
		final int cant = g.getCantidad_inv();

		
		AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
		builder.setTitle(elem.getNombre());

		builder.setIcon(g.getFoto());

		builder.setPositiveButton("Pick",
				new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						String s = HttpUtils.cogerElemento(ctx, elem);

						if (parseRespuestaMensaje(s) == -1) {
						

							if (Helper.getDataHelper(ctx).updateCantidadInv(
									(int) g.getId(), cant + 1)){
								Toast.makeText(ctx,
										"Has cogido " + elem.getNombre(),
										Toast.LENGTH_SHORT).show();
								MapaActivity.refreshItems(s);
							}
							else

								Toast.makeText(
										ctx,
										"No has cogido el elemento "
												+ elem.getNombre(),
										Toast.LENGTH_SHORT).show();
						} else
							Toast.makeText(
									ctx,
									"Llegas tarde, alguien ya ha cogido el elemento "
											+ elem.getNombre(),
									Toast.LENGTH_SHORT).show();
					}

				});
		builder.setNegativeButton("Cancel",
				new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// nada
					}
				});

		AlertDialog alert = builder.create();
		alert.show();
	}


	
	public static void creaDialogo(final Context ctx,
			final String s) {


		AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
		builder.setTitle("New Message");
		builder.setIcon(R.drawable.logo);
		builder.setMessage(s);
		final EditText txt = new EditText(ctx);

		
		builder.setPositiveButton("Reply",
				new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						HttpUtils.sendMessage(ctx, Utils.getMail(s), txt.getText()
								.toString());
						dialog.cancel();
						Toast.makeText(ctx, "Mensaje enviado", Toast.LENGTH_SHORT)
								.show();
					}

				});
		builder.setNegativeButton("Ok",
				new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// nada
					}
				});

		AlertDialog alert = builder.create();
		alert.show();
		
		
		
		
		
		
		
		
		
//		
//		final Dialog dialog = new Dialog(ctx);
//		dialog.setContentView(R.layout.user_dialog_contestar);
//		dialog.setTitle("RE:"+s);
//		dialog.setCancelable(true);
//
//		ImageView img = (ImageView) dialog.findViewById(R.id.imagen);
//		img.setImageResource(R.drawable.logo);
//
//		final EditText txt = (EditText) dialog
//				.findViewById(R.id.edit_text_mensaje);
//
//
//		Button btnReply = (Button) dialog.findViewById(R.id.btn_msensaje_reply);
//		Button btnOK = (Button) dialog.findViewById(R.id.button1);
//
//		btnReply.setOnClickListener(new OnClickListener() {
//
//			@Override
//			public void onClick(View v) {
//				HttpUtils.sendMessage(ctx, Utils.getMail(s), txt.getText()
//						.toString());
//				dialog.cancel();
//				Toast.makeText(ctx, "Mensaje enviado", Toast.LENGTH_SHORT)
//						.show();
//				
//			}
//		});
//
//		btnOK.setOnClickListener(new OnClickListener() {
//
//			@Override
//			public void onClick(View v) {
//				dialog.cancel();
//			}
//		});
//
//		dialog.show();
	}
	
	
	
	private static int parseRespuestaMensaje(String s) {
		int res = 0;
		try {
			JSONObject j = new JSONObject(s);
			res = j.getInt(JSON.RESULTADO);
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return res;
	}

}
